package com.sxj.corejava.code07_面向对象.bms;

import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2024年03月26日 19:10
 * @version 1.0
 * 银行主菜单,该页面只有成功登录之后才能访问,因此不提供main方法
 */
public class BankMenu {

    private Scanner sc = new Scanner(System.in);
    // 由于该类中的方法必须成功登录之后才能访问
    // 需要限制实例化该类必须登录
    // 提供一个有参构造方法,方法的参数是一个账户信息即可
    private Account account;

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public BankMenu(Account account) {
        this.account = account;
    }


    public void showMenu() {
        System.out.println("********************欢迎进入紫金银行主菜单********************");
        System.out.print("请选择服务(1.存款 2.取款 3.查询余额 4.转账 5.贷款 6.还贷 7.查询贷款金额 8.修改密码 9.退出登录):");
        // 每一个菜单功能对应一个方法
        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                deposit();
                break;
            case 2:
                withdraw();
                break;
            case 3:
                queryBalance();
                break;
            case 4:
                transfer();
                break;
            case 5:
                providerLoan();
                break;
            case 6:
                payLoan();
                break;
            case 7:
                queryLoan();
                break;
            case 8:
                modifyPassword();
                break;
            case 9:
                logout();
                break;
        }
    }

    public void deposit() {
        System.out.println("********************开始存款********************");
        System.out.print("请输入存款的金额:");
        double money = sc.nextDouble();
        // 调用账户类提供的存款方法
        account.deposit(money);
        System.out.println("提示:恭喜您,存款成功!");
        // 回到主菜单
        showMenu();
    }

    public void withdraw() {
        System.out.println("********************开始取款********************");
        System.out.print("请输入取款金额:");
        double money = sc.nextDouble();
        // 调用取款方法
        // 此时account属于账户的父类,通过多态的方式自动调用对应子类的方法
        boolean flag = account.withdrawMoney(money);
        if (flag) {
            System.out.println("提示:恭喜您,取款成功!");
        } else {
            System.out.println("错误:对不起,您的账户余额不足,取款失败!");
        }
        showMenu();
    }

    public void queryBalance() {
        System.out.println("********************查询余额********************");
        System.out.println("您当前账户余额为:" + account.getBalance() + "元");
        showMenu();
    }

    public void transfer() {
        System.out.println("********************开始转账********************");
        System.out.print("请输入目标账户卡号:");
        int id = sc.nextInt();
        // 根据卡号查询对应的账户信息
        Account targetAccount = Bank.findById(id);
        // 判断是否找到对应账户
        if (account == null) {
            System.out.println("错误:对不起,您输入的卡号有误,请重新输入!");
        } else {
            // 如果目标账户存在,则开始转账
            System.out.print("请输入转账金额:");
            double money = sc.nextDouble();
            // 只有当前账户余额高于转账的金额时,才能进行转账
            if (account.getBalance() >= money) {
                // 当前账户的余额减少
                account.setBalance(account.getBalance() - money);
                // 目标账户的余额增加
                targetAccount.setBalance(targetAccount.getBalance() + money);
                System.out.println("提示:恭喜您,转账成功!");
            } else {
                System.out.println("错误:对不起,转账失败,您的账户余额不足!");
            }
        }
        showMenu();
    }

    public void providerLoan() {
        System.out.println("********************开始贷款********************");
        // 只有贷款的储蓄账户与贷款的信用账户可以贷款
        // 即:只有实现了贷款接口的账户可以进行贷款功能
//        Loanable loanable = new LoanSavingAccount();
//        Loanable loanable2 = new LoanCreditAccount();
        // 由于能够贷款的账户是可以转换成对应接口类型的
        // 因此判断当前账户是否可以转换成对应贷款接口类型
        // 如果能够转换则说明属于可贷款账户
        if (account instanceof Loanable) {
            // 将当前账户转换成贷款接口类型
            Loanable loanable = (Loanable) account;
            System.out.print("请输入贷款金额:");
            double money = sc.nextDouble();
            // 执行贷款方法
            loanable.providerLoan(money);
            System.out.println("提示:恭喜您,贷款成功!");
        } else {
            System.out.println("错误:对不起,您的账户不属于贷款账户,无法进行贷款相关操作!");
        }
        showMenu();
    }

    public void payLoan() {
        System.out.println("********************开始还贷********************");
        // 只有贷款账户可以进行还贷操作
        if (account instanceof Loanable) {
            Loanable loanable = (Loanable) account;
            System.out.print("请输入需要还贷的金额:");
            double money = sc.nextDouble();
            boolean flag = loanable.payLoan(money);
            if (flag) {
                System.out.println("提示:恭喜您,还贷成功!");
            } else {
                System.out.println("错误:对不起,您的账户余额不足,还贷失败!");
            }
        } else {
            System.out.println("错误:对不起,您的账户不属于贷款账户,无法进行贷款相关操作!");
        }
        showMenu();
    }

    public void queryLoan() {
        System.out.println("********************开始贷款金额********************");
        // 只有贷款账户可以进行贷款相关操作
        if (account instanceof Loanable) {
            Loanable loanable = (Loanable) account;
            System.out.println("提示:您当前贷款的总金额为:" + loanable.queryLoan());
        } else {
            System.out.println("错误:对不起,您的账户不属于贷款账户,无法进行贷款相关操作!");
        }
        showMenu();
    }

    public void modifyPassword() {
        System.out.println("********************修改密码********************");
        System.out.print("请输入原密码:");
        String oldPassword = sc.next();
        // 只有原密码正确时才能进行修改密码的操作
        if (oldPassword.equals(account.getPassword())) {
            System.out.print("请输入新密码:");
            String newPassword = sc.next();
            System.out.print("请再次输入新密码:");
            String newPassword2 = sc.next();
            if (newPassword.equals(newPassword2)) {
                // 如果两次输入的密码一致,则可以修改
                account.setPassword(newPassword);
                System.out.println("提示:恭喜您,密码修改成功,请重新登录");
                new Start().showMenu();
            } else {
                System.out.println("错误:您两次输入的密码不一致,密码修改失败");
            }
        } else {
            System.out.println("错误:您输入的原密码不正确,密码修改失败!");
        }
        showMenu();
    }

    public void logout() {
        System.out.println("提示:您已退出!");
        new Start().showMenu();
    }
}
